package com.lantosec.hmrp.modules.workflow.service;

import com.lantosec.hmrp.core.kit.Result;
import com.lantosec.hmrp.modules.workflow.vo.*;
import com.lantosec.hmrp.core.kit.PageVO;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.ExtensionAttribute;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.repository.Model;
import org.flowable.engine.repository.ProcessDefinition;

import java.util.List;

/**
 * 工作流部署相关
 */
public interface IWorkflowRepositoryService {

    /**
     * 分页查询模型数据
     *
     * @param page        分页对象
     * @param modelName   模型名称
     * @param modelTypeId 模型类型
     * @return 模型数据列表的分页对象
     */
    PageVO<FlowModelVO> modelList(PageVO page, String modelName, String modelTypeId);

    /**
     * 根据ID查询工作流模型对象
     *
     * @param modelId modelId
     * @return 模型对象
     */
    ModelVO queryModelById(String modelId);

    /**
     * 模型的编辑源码，XML文件内容
     *
     * @param byteArrayId bytearray表ID
     * @return XML文件内容
     */
    String modelEditorSource(String byteArrayId);

    /**
     * 模型的编辑图片源码，SVG文件内容转成Base64
     *
     * @param bytearrayId bytearray表ID
     * @return SVG文件Base64内容
     */
    String modelEditorSourceExtra(String bytearrayId);

    /**
     * 分页查询部署的流程
     *
     * @param name      流程名称
     * @param startTime 部署开始时间
     * @param endTime   部署开始
     * @return 流程列表的分页对象
     */
    PageVO deploymentList(PageVO page, String name, String startTime, String endTime);

    /**
     * 添加流程模型并返回modelId
     *
     * @param modelName      模型名称
     * @param category       模型分类
     * @return 模型ID
     */
    Result<String> createModel(String modelName, String category);

    /**
     * 保存流程模型数据
     *
     * @param model 流程模型
     */
    void saveModel(ModelVO model);

    /**
     * 删除流程模型，慎用之
     *
     * @param modelId 模型ID
     */
    void deleteModel(String modelId);

    /**
     * 删除部署的流程
     *
     * @param deploymentId 部署ID
     */
    void deleteDeployment(String deploymentId);

    /**
     * 激活流程定义
     *
     * @param deploymentId 流程定义ID
     */
    void activateProcessDefinitionById(String deploymentId);

    /**
     * 挂起流程定义
     * 如果流程定义处于挂起状态，则不可能基于流程定义启动新的流程实例。
     *
     * @param deploymentId 流程定义ID
     */
    void suspendProcessDefinitionById(String deploymentId);

    /**
     * 根据流程部署ID查询流程定义信息，查询当前版本最高的一条
     *
     * @param deploymentId 流程定义ID
     */
    FlowProcdefVO procdefByDeploymentId(String deploymentId);

    /**
     * 根据流程Key获取最新的流程定义
     *
     * @param definitionKey 流程KEY
     */
    FlowProcdefVO getProcessDefinitionByKey(String definitionKey);

    /**
     * 获取用户任务对象
     * @param userTaskId            任务Id
     * @param processDefinitionId   流程定义Id
     * @return
     */
    UserTask getUserTask(String userTaskId, String processDefinitionId);

    /**
     * 获取节点对象的自定义属性列表
     *
     * @param userTaskId          节点id
     * @param processDefinitionId 流程定义id
     * @param customAttributeName  属性名
     * @return
     */
    List<ExtensionAttribute> getCustomAttribute(String userTaskId, String processDefinitionId, String customAttributeName);

    /**
     * 从task中获取自定义属性对象
     * @param userTaskId          节点id
     * @param processDefinitionId 流程定义id
     * @return
     */
    CustomAttributeVO getCustomAttribute(String userTaskId, String processDefinitionId);
    /**
     * 从task中获取自定义属性对象
     * @param userTaskId    节点id
     * @param bpmnModel     bpmn对象
     * @return
     */
    CustomAttributeVO getCustomAttribute(String userTaskId, BpmnModel bpmnModel);

    /**
     * 从task中获取自定义属性对象
     * @param userTask          用户节点
     * @return
     */
    CustomAttributeVO getCustomAttribute(UserTask userTask);

    /**
     * 从FlowElement中获取扩展属性对象
     * @param flowElementId          节点Id
     * @return
     */
    CustomExtensionElementVO getExtensionElement(String flowElementId, String processDefinitionId);

    /**
     * 最新流程部署列表
     * @return
     */
    List<FlowProcdefVO> processDefinitionList();
}
